spring mvc +cookie+拦截器功能 实现系统自动登陆

先看看我遇到的问题:

@ResponseBody
    @RequestMapping("/logout")
    public Json logout(HttpSession session,HttpServletRequest request,HttpServletResponse response) {
        Json j = new Json();
        if (session != null) {
//          session.invalidate();
            session.removeAttribute("U");
        }
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("userCookie".equals(cookie.getName())) {
                    cookie.setValue("");
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);
                }
            }
        }
        j.setSuccess(true);
        j.setMsg("注销成功!");
        return j;
    }

然后看到的cookie是:

拦截器这边:

public class PermissionInterceptor implements HandlerInterceptor {

@Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        String requestUri = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = requestUri.substring(contextPath.length());
        if (excludeUrls.contains(url)) {
            return true;
        }
        HttpSession session = request.getSession();
        User u = (User) session.getAttribute("U");
        if (null==u) {
            Cookie[] cookies = request.getCookies();
            if (cookies!=null && cookies.length>0) {
                for (Cookie cookie : cookies) {
                    if ("userCookie".equals(cookie.getName())) {
                        String name = cookie.getValue();
                        if (BaseUtil.isEmpty(name)) {
                            String[] ss = name.split(",");
                            if (userService.exsit("name", ss[0].trim(), "pwd", ss[1].trim())) {
                                u = userService.findEntity("name", ss[0].trim(), "pwd", ss[1].trim());
                                session.setAttribute("U", u);
                                break;
                            }
                        }
                    }
                }
            }
        }

}

看到的结果是:

看出问题了吧,cookie 竟然不一样,不知道看到此处,你是否知道问题出在哪里。

我还发表了一个问题讨论:http://www.oschina.net/question/6556_233128

下面我们就进入正题了。

先看spring mvc 的拦截器:

package com.tw.interceptor;

import java.util.List;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.tw.entity.sys.Permission;
import com.tw.entity.sys.RolesPermissionRel;
import com.tw.entity.sys.User;
import com.tw.entity.sys.UserRoleRel;
import com.tw.service.sys.PermissionService;
import com.tw.service.sys.RolesPermissionRelService;
import com.tw.service.sys.UserRoleRelService;
import com.tw.service.sys.UserService;
import com.tw.util.BaseUtil;
import com.tw.util.MD5;

public class PermissionInterceptor implements HandlerInterceptor {

    @Autowired
    private UserRoleRelService userRoleRelService;
    @Autowired
    private RolesPermissionRelService rolesPermissionRelService;
    @Autowired
    private PermissionService permissionService;
    @Autowired
    private UserService userService;
    private ListexcludeUrls;

    public ListgetExcludeUrls() {
        return excludeUrls;
    }

    public void setExcludeUrls(ListexcludeUrls) {
        this.excludeUrls = excludeUrls;
    }

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        String requestUri = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = requestUri.substring(contextPath.length());
        if (excludeUrls.contains(url)) {
            return true;
        }
        HttpSession session = request.getSession();
        User u = (User) session.getAttribute("U");
        if (null==u) {
            Cookie[] cookies = request.getCookies();
            if (cookies!=null && cookies.length>0) {
                for (Cookie cookie : cookies) {
                    if ("userCookie".equals(cookie.getName())) {
                        String name = cookie.getValue();
                        if (BaseUtil.isEmpty(name)) {
                            String[] ss = name.split(",");
                            if (userService.exsit("name", ss[0].trim(), "pwd", ss[1].trim())) {
                                u = userService.findEntity("name", ss[0].trim(), "pwd", ss[1].trim());
                                session.setAttribute("U", u);
                                break;
                            }
                        }
                    }
                }
            }
        }
        if (null==u) {
            response.sendRedirect("login.jsp");
            return false;
        }

        HandlerMethod method = (HandlerMethod)handler;
        Perm perm = method.getMethodAnnotation(Perm.class);
        if (perm==null) {
            return true;
        }
        Listur = userRoleRelService.findByProperty("id.userId", u.getId());
        for (UserRoleRel userRoleRel : ur) {
            Listrp = rolesPermissionRelService.findByProperty("id.roleId", userRoleRel.getId().getRoleId());
            for (RolesPermissionRel rolesPermissionRel : rp) {
                Permission permission = permissionService.find(rolesPermissionRel.getId().getPermissionId());
                if (perm.privilegeValue().equals(permission.getPermissionCode())) {
                    return true;
                }
            }
        }
        request.getRequestDispatcher("/error/noSecurity.jsp").forward(request, response);

        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {

    }
}

再看登录实现:

@ResponseBody
    @RequestMapping("/login")
    public Json login(String name,String pwd,String remember,Model model,HttpSession session,
            HttpServletRequest request,HttpServletResponse response) {
        Json json = new Json();

        if (userService.exsit("name", name.trim(), "pwd", MD5.MD5Encode(pwd.trim()))) {
            User u = userService.findEntity("name", name.trim(), "pwd", MD5.MD5Encode(pwd.trim()));
            if (u.getCancel().equals("1")) {
                if ("yes".equals(remember.trim())) {
                    Cookie cookie = new Cookie("userCookie", u.getName() + ","  + u.getPwd());
                    cookie.setMaxAge(60 * 60 * 24 * 14);//保存两周
                    cookie.setPath("/");
                    response.addCookie(cookie);
                }
                session.setAttribute("U", u);
//                return "redirect:/main";
                json.setMsg("登陆成功");
                json.setSuccess(true);
                return json;
            }else {
                json.setMsg("对不起你的账号还没有通过邮箱验证");
//                model.addAttribute("errorMsg", "对不起你的账号还没有通过邮箱验证");
            }
        }else {
            json.setMsg("用户名或密码错误");
//            model.addAttribute("errorMsg", "用户名或密码错误");
        }
        return json;
//        return "login";
    }

还有注销的:

@ResponseBody
    @RequestMapping("/logout")
    public Json logout(HttpSession session,HttpServletRequest request,HttpServletResponse response) {
        Json j = new Json();
        if (session != null) {
//            session.invalidate();
            session.removeAttribute("U");
        }
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("userCookie".equals(cookie.getName())) {
                    Cookie cookie2 = new Cookie("userCookie", null);
                    cookie2.setMaxAge(0);
                    cookie2.setPath("/");
                    response.addCookie(cookie2);
                    break;
                }
            }
        }
        j.setSuccess(true);
        j.setMsg("注销成功!");
        return j;
    }

看到这里你是否已经知道了之前问题的存在原因呢?

我先不考诉你们,谁知道这里面的错误原因可以在上面留言哦!

我想页面就简单多了,因为是执行方法之前拦截判断的,所以只要你存放有cookie无论调用那个页面都可以自动实现登陆。

补充一个问题:HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Control character in cookie value or attribute.

看到这样的错误你知道是怎么回事么?

时间: 2024-08-02 02:50:41

spring mvc +cookie+拦截器功能 实现系统自动登陆的相关文章

[转载] Spring MVC - 处理器拦截器

5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   5.1.1.常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间

玩转spring MVC(七)----拦截器

继续在前边的基础上来学习spring MVC中拦截器的使用,下面通过一个例子来实现(完整项目在这里下载:http://download.csdn.net/detail/u012116457/8433425). 首先在项目中添加interceptor-servlet.xml来配置拦截器,当然,必须在web.xml中配置在tomcat启动时加载,如下: <!--1.配置spring分发器(是总的控制中心 被拦截的url会汇聚到该servlet) --> <servlet> <se

Spring mvc登录拦截器

自己实现的第一个Spring mvc登录拦截器 题目要求:拒绝未登录用户进入系统,只要发现用户未登录,则将用户请求转发到/login.do要求用户登录 实现步骤: 1.在spring的配置文件中添加登录拦截,如下: spring-web.xml <mvc:interceptors> <!-- 配置登陆拦截器 --> <mvc:interceptor> <mvc:mapping path="/**"/> //拦截所有请求 <mvc:e

Spring MVC中拦截器HandlerInterceptorAdapter中的preHandle方法

拦截器:顾名思义,就是对请求进行拦截,做一些预处理.后处理或返回处理的操作 Spring MVC中使用拦截器的方法,继承HandlerInterceptorAdapter类,并根据需求实现其中的preHandle方法(预处理).postHandle方法(返回处理),afterCompletion方法(后处理). public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object han

spring mvc 多拦截器

上次大概写了个可以解决velocity 多视图的东西. 但是实际运用过程中有到处找了些资料看了下.这里 小计下: DispatcherServlet解析过程: 1.HandlerMapping 用于定位具体的Controller类我习惯叫pagehandle,我认为是模块分发modelfactory eg:implement 这个是比较标准,我继承过其他的HandlerMapping 但是实际自己使用还是从接口开始更好实现 public classSpringMvcExtendHandlerMa

码农小汪-Spring MVC 处理器拦截器详解

处理器拦截器简介 spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理 常见应用场景 日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记 录结束时间,从而得到该请求的处理

Spring MVC的拦截器

什么是拦截器? 拦截器是指通过统一拦截从浏览器发送到服务器的请求来完成我们对功能的增强. Java过滤器跟SpringMVC的拦截器有什么不同? 定义:拦截器是可以拦截我们配置的方法,并且在我们的方法请求前后去做一些处理,比如做字符编码,验证校验等. 而过滤器:是在javaweb中,你传入的request.response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有

Spring MVC定义拦截器

拦截器: package sy.Interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyI

基于Spring MVC 实现拦截器

Spring MVC 拦截器 一,具体内容: 在所有的开发之中拦截器属于一个重要的组件,可以说几乎所有的项目都会提供的概念应用,不管是Spring MVC,还是Struts 2.x都是提供有拦截器的,利用拦截器可以实现更加方便的数据验证处理. 1,认识拦截器 所谓的拦截器指的是在用户和具体操作的Action之间做了一个屏障,以保证提交到提交到Action的数据是真实有效的数据: 如果要想实现拦截器的操作处理,那么必须掌握"org.springframework.web.servlet.Handl