码迷,mamicode.com
首页 > Web开发 > 详细

shiroWeb项目-登陆与退出实现(九)

时间:2017-07-29 22:18:07      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:wpa   jni   jpg   failure   except   apach   访问   logo   错误   

原理

使用FormAuthenticationFilter过虑器实现 ,原理如下:

 

将用户没有认证时,请求loginurl进行认证,用户身份和用户密码提交数据到loginurl

FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的)

FormAuthenticationFilter调用realm传入一个token(username和password)

realm认证时根据username查询用户信息(在Activeuser中存储,包括 userid、usercode、username、menus)。

如果查询不到,realm返回null,FormAuthenticationFilter向request域中填充一个参数(记录了异常信息)

 

登陆页面

由于FormAuthenticationFilter的用户身份和密码的input的默认值(username和password),修改页面的账号和密码 的input的名称为username和password

 

代码控制:(只对错误进行控制,认证过程由realm传递给Authenticator认证信息)

package cn.qlq.springmvc.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.qlq.springmvc.Exception.MyException;
import cn.qlq.springmvc.pojo.ActiveUser;
import cn.qlq.springmvc.service.SysService;

@Controller
public class LoginController {

    @Autowired
    private SysService sysService;

    // 登陆提交地址,和applicationContext-shiro.xml中配置的loginurl一致
    @RequestMapping("/login.action")
    public String login(HttpServletRequest request) throws Exception {

        // 如果登陆失败从request中获取认证异常信息,shiroLoginFailure就是shiro异常类的全限定名
        String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
        // 根据shiro返回的异常类路径判断,抛出指定异常信息
        if (exceptionClassName != null) {
            if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
                // 最终会抛给异常处理器
                throw new MyException("账号不存在");
            } else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
                throw new MyException("用户名/密码错误");
            } else if ("randomCodeError".equals(exceptionClassName)) {
                throw new MyException("验证码错误 ");
            } else {
                throw new Exception("不是账户错误,也不是密码错误");// 最终在异常处理器生成未知错误
            }
        }
        // 此方法不处理登陆成功(认证成功),shiro认证成功会自动跳转到上一个请求路径
        // 登陆失败还到login页面
        return "login";
    }

}

 认证过滤拦截器

技术分享

 

 

--------------------------------------------退出-------------------------------

     使用LogoutFilter

 

不用我们去实现退出,只要去访问一个退出的url(该 url是可以不存在),由LogoutFilter拦截住,清除session。

在applicationContext-shiro.xml配置LogoutFilter:

 

 技术分享

页面中:

技术分享

 

shiroWeb项目-登陆与退出实现(九)

标签:wpa   jni   jpg   failure   except   apach   访问   logo   错误   

原文地址:http://www.cnblogs.com/qlqwjy/p/7257529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!