package com.skynet.collection.controller;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.ExcessiveAttemptsException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import com.skynet.collection.service.ICollectionInfoService;
import com.skynet.collection.service.IUserService;
import com.skynet.collection.utils.Pagination;
import com.skynet.collection.utils.SearchParams;
import com.skynet.collection.utils.VerifyCodeUtil;
import com.skynet.collection.vo.CollectionInfo;
import com.skynet.collection.vo.User;
/**
* <p>Title: 用户管理控制器</p>
* <p>Description: </p>
*
* @author Liujian
* @version 1.00.00
* <pre>
* 修改记录:
* 版本号 修改人 修改日期 修改内容
*/
@Controller
@RequestMapping("user")
public class UserController {
private static final Logger logger = Logger.getLogger(UserController.class);
@Autowired
private IUserService userService;
@Autowired
private ICollectionInfoService collectionInfoService;
@RequestMapping("login")
public String login() {
return "user/login";
}
@RequestMapping("index")
public String index(Model model, @ModelAttribute("params") SearchParams params) {
Pagination<User> pageList = null;
String resultPageURL = "user/index";
try {
User loginUser = getUserBySubject();
if (loginUser.getIsGuest() == 1) { // 如果是来宾用户,则直接跳转到信息录入界面,已录入过信息的跳转到录入详情界面
CollectionInfo collectionInfo = this.collectionInfoService.selectByIdCardNo(loginUser.getUserId());
if (collectionInfo == null) { // 没有采集信息则跳转到新增页面,有则跳转详情页
resultPageURL = "collection/add";
} else {
model.addAttribute("collectionInfo", collectionInfo);
resultPageURL = "collection/view";
}
} else { // 系统用户展示列表
pageList = this.userService.findByCondication(params);
model.addAttribute("pageList", pageList);
}
} catch (Exception e) {
logger.error(e.getMessage());
}
return resultPageURL;
}
/**
* 用户登录
* @param user
* @param model
* @param request
* @return
*/
@RequestMapping(value="/login", method=RequestMethod.POST)
public String login(User user, Model model, HttpServletRequest request){
String resultPageURL = InternalResourceViewResolver.REDIRECT_URL_PREFIX + "/user/login";
String username = user.getUserName();
String password = user.getUserPwd();
//获取HttpSession中的验证码
String verifyCode = (String)request.getSession().getAttribute("verifyCode");
//获取用户请求表单中输入的验证码
String submitCode = user.getVerifyCode();
logger.info("用户[" + username + "]登录时输入的验证码为[" + submitCode + "],HttpSession中的验证码为[" + verifyCode + "]");
if (StringUtils.isEmpty(submitCode) || !StringUtils.equals(verifyCode, submitCode.toLowerCase())){
model.addAttribute("message_login", "验证码不正确");
return resultPageURL;
}
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
logger.info("为了验证登录用户而封装的token为" + ReflectionToStringBuilder.toString(token, ToStringStyle.MULTI_LINE_STYLE));
//获取当前的Subject
Subject currentUser = SecurityUtils.getSubject();
try {
//在调用了login方法后,SecurityManager会收到AuthenticationToken,并将其发送给已配置的Realm执行必须的认证检查
//每个Realm都能在必要时对提交的AuthenticationTokens作出反应
//所以这一步在调用login(token)方法时,它会走到MyRealm.doGetAuthenticationInfo()方法中,具体验证方式详见此方法
// 尝试登录
token.setRememberMe(true);
currentUser.login(token);
logger.info("对用户[" + username + "]进行登录验证..验证开始");
logger.info("对用户[" + username + "]进行登录验证..验证通过");
//验证是否登录成功
if(currentUser.isAuthenticated()){
resultPageURL = InternalResourceViewResolver.REDIRECT_URL_PREFIX + "/user/index";
logger.info("用户[" + username + "]登录认证通过(这里可以进行一些认证通过后的一些系统参数初始化操作)");
}else{
token.clear();
}
}catch(UnknownAccountException uae){
logger.info("对用户[" + username + "]进行登录验证..验证未通过,未知账户");
model.addAttribute("message_login", "用户名或密码错误");
}catch(IncorrectCredentialsException ice){
logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误的凭证");
model.addAttribute("message_login", "用户名或密码错误");
}catch(LockedAccountException lae){
logger.info("对用户[" + username + "]进行登录验证..验证未通过,账户已锁定");
model.addAttribute("message_login", "账户已锁定");
}catch(ExcessiveAttemptsException eae){
logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误次数过多");
model.addAttribute("message_login", "用户名或密码错误次数过多");
}catch(AuthenticationException ae){
//通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景
logger.info("对用户[" + username + "]进行登录验证..验证未通过,堆栈轨迹如下");
ae.printStackTrace();
logger.error(ae.getMessage());
model.addAttribute("message_login", "用户名或密码不正确");
}
return resultPageURL;
}
/**
* 获取验证码图片和文本(验证码保存在HttpSession中)
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/getVerifyCodeImage")
public void getVerifyCodeImage(HttpServletRequest request, HttpServletResponse response) {
//设置页面不缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
String verifyCode = VerifyCodeUtil.generateTextCode(VerifyCodeUtil.TYPE_NUM_ONLY, 4, null);
//将验证码放到HttpSession里面
request.getSession().setAttribute("verifyCode", verifyCode);
logger.info("本次生成的验证码为[" + verifyCode + "],已存放到HttpSession中");
//设置输出的内容的类型为JPEG图像
response.setContentType("image/jpeg");
BufferedImage bufferedImage = VerifyCodeUtil.generateImageCode(verifyCode, 90, 30, 20, true, Color.WHITE, Color.BLACK, null);
//写给浏览器
try {
Ima
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
刚好最近要做一个项目,所以把这个集成环境继续完善了一下。采用Maven构建的Spring+SpringMVC+MyBatis+Shiro的集成开发环境。加入了Mybatis PageHelper分页组件,并抽象出了BaseService层。另外加入了Shrio完成登录验证和权限部分的验证操作。表包含有用户、角色、权限、角色权限表等,权限部分呢比较简单,用户拥有角色,角色与资源多对多的关系。使用过程中有疑问请加群476756647,期待和各位朋友一起学习成长。
资源推荐
资源详情
资源评论
收起资源包目录
SSM2.0纯净Maven构建的SpringMVC+MyBatis+Shiro (121个子文件)
UserController.class 9KB
CollectionInfo.class 6KB
VerifyCodeUtil.class 4KB
MyShiroRealm.class 4KB
User.class 4KB
Org.class 3KB
UserServiceImpl.class 3KB
Race.class 2KB
Pagination.class 2KB
BaseServiceImpl.class 2KB
ShiroTest.class 2KB
BaseTest.class 2KB
CollectionInfoServiceImpl.class 2KB
SearchParams.class 2KB
PermissionServiceImpl.class 2KB
RoleServiceImpl.class 2KB
Area.class 1KB
Permission.class 1KB
UserTest.class 1KB
IUserService.class 1KB
RolePersKey.class 888B
Role.class 876B
UserMapper.class 831B
PermissionMapper.class 727B
IBaseService.class 721B
RoleMapper.class 657B
IBaseMapper.class 635B
CollectionMapper.class 580B
IPermissionService.class 530B
ICollectionInfoService.class 507B
IRoleService.class 500B
AreaMapper.class 496B
RaceMapper.class 496B
OrgMapper.class 492B
RolePersMapper.class 337B
.classpath 839B
org.eclipse.wst.common.component 565B
org.eclipse.wst.jsdt.ui.superType.container 49B
UserController.java 9KB
VerifyCodeUtil.java 8KB
CollectionInfo.java 6KB
MyShiroRealm.java 3KB
User.java 3KB
Org.java 3KB
Pagination.java 2KB
Race.java 2KB
UserServiceImpl.java 2KB
UserTest.java 2KB
BaseTest.java 1KB
ShiroTest.java 1KB
BaseServiceImpl.java 1KB
CollectionInfoServiceImpl.java 1KB
SearchParams.java 1KB
PermissionServiceImpl.java 950B
Permission.java 947B
Area.java 930B
RoleServiceImpl.java 861B
IUserService.java 687B
UserMapper.java 661B
PermissionMapper.java 639B
CollectionMapper.java 617B
RoleMapper.java 525B
Role.java 510B
RolePersKey.java 475B
AreaMapper.java 441B
RaceMapper.java 441B
OrgMapper.java 432B
IBaseService.java 422B
IBaseMapper.java 396B
ICollectionInfoService.java 389B
RolePersMapper.java 328B
IPermissionService.java 268B
IRoleService.java 238B
.jsdtscope 508B
index.jsp 2KB
login.jsp 1KB
view.jsp 830B
add.jsp 828B
index.jsp 769B
MANIFEST.MF 108B
MANIFEST.MF 39B
.mymetadata 290B
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.jdt.core.prefs 664B
org.eclipse.core.resources.prefs 119B
org.eclipse.m2e.core.prefs 90B
com.genuitec.eclipse.j2eedt.core.prefs 56B
.project 2KB
log4j.properties 1KB
log4j.properties 1KB
jdbc.properties 454B
jdbc.properties 454B
pom.properties 203B
das.sql 252KB
das.sql 252KB
CollectionMapper.xml 13KB
CollectionMapper.xml 13KB
UserMapper.xml 8KB
UserMapper.xml 8KB
OrgMapper.xml 6KB
共 121 条
- 1
- 2
资源评论
- 悟纤2016-07-15没有太大参考价值,刚入门者可以下载看看。
- jin46722016-11-08没什么太大价值 不太好 有瑕疵
- james4lee2016-05-26很好的资源,感谢分享
- iiidasol2016-08-03很好 我下来看了一下 挺适合学习使用的 感谢分享
kugeliujian
- 粉丝: 4
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- CBT 3847-1999 船用扁圆形焊接钢法兰.pdf
- CBZ 27-1980 船体结构低温焊接.pdf
- CBT 3962-2005 船用焊接异径铜法兰.pdf
- CBZ 258-1989 铝合金船体氩弧焊接工艺规程.pdf
- CBZ 69-1986 铸钢艉柱手工焊接工艺.pdf
- CBZ 66-1987 铜板的焊接.pdf
- CBZ 802-2007 陶质衬垫CO2单面焊焊接工艺.pdf
- CBZ 801-2007 熔嘴电渣焊焊接工艺.pdf
- CBZ39-1987_焊接材料的验收、存放和使用.pdf
- CBZ124-1998_潜艇921A等钢结构焊接技术要求.pdf
- CBZ126-1998潜艇耐压船体可拆板切割、装配和焊接技术要求.pdf
- CECS 330-2013 钢结构焊接热处理技术规程.pdf
- CJT 32-2004 液化石油气钢瓶焊接工艺评定.pdf
- C-HRA-1镍基合金的焊接工艺性能研究.pdf
- CMT焊接在堆焊(包覆)镍基耐蚀合金层中的应用.pdf
- CNG高压储罐焊接制造质量保证.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功