CRM-拦截器

接上一篇:CRM-业务主页面index.jsp

1. 登录验证

有两个方法:

1.1 过滤器

implements Filter{
destory():
doFilter();
init();

}
具体实例如下:

package text.frist.Emp.filter;

import text.frist.Emp.entity.Admin;
import text.frist.Emp.serive.AdminService;
import text.frist.Emp.serive.impl.AdminServiceImpl;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter(filterName = "CheckFilter",value = "/admin/safe/*")
public class CheckFilter implements Filter {
    public void destroy() {}
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        HttpSession session = request.getSession();
        Admin admin =(Admin)session.getAttribute("admin");
        if(admin!=null){
            chain.doFilter(req, resp);
        }else {
			response.sendRedirect(request.getContextPath()+"/login.html");
        }
    }
    public void init(FilterConfig config) throws ServletException {}
}
  1. request.getSession();
  2. session.getAttribut(“”);获取session作用域中保存的登录数据
  3. 判断是否为空。
  4. 为空:就是没有登录过,response.sendRedirect(“登录页面路径”)
  5. 这里注意重定向的路径前面要加上项目名称,这里request.getContextPath()获取
  6. 不为空:放行,chain.doFilter(req,resp);

1.2 拦截器

implements HandlerInterceptor{
preHandle();
postHandle();
afterCompletion();
}
然后再mvc.xml文件中配置


    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/login/test2"/>
            <mvc:mapping path="/login/test3"/>
            <bean class="com.lyx.interceptor.MyInterceptor1">
            bean>
        mvc:interceptor>
    mvc:interceptors>

具体实例如下:

package com.lyx.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class MyInterceptor1 implements HandlerInterceptor{
    //在handler之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断登录状态
        HttpSession session = request.getSession();
        if(session.getAttribute("state")!=null){
            return true;
        }
        //中断之后,响应请求
        response.sendRedirect(request.getContextPath()+"/login.jsp");
        return false;
    }

    //在handler之后执行,响应之前执行
    @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 {}
}


  1. request.getSession();
  2. session.getAttribute(“”);获取user
  3. 判断是否为空
  4. 为空:response.sendRedirect(“”);跳转到登录页面
  5. 不为空:放行,return true;

2. 实现登录验证

2.1 写一个拦截器

在com.lyx.settings.web包下新建interceptor包
新建LoginInterceptor.java类,实现HandlerInterceptor接口
重写preHandler()方法,postHandler()和afterCompletion()方法不变
CRM-拦截器_第1张图片

response.sendRedirect(request.getContextPath())怎么实现跳转到登录页面?
我的tomcat的
CRM-拦截器_第2张图片
项目名称就是”/“,所以getContextPath()的值就是”/“,indexController类的index()方法的@RequestMapping(“/”)也是“/”就可以访问到项目首页,项目首页再通过

<script type="text/javascript">
    document.location.href = "/settings/qx/user/toLogin.do";
script>

调用UserController的toLogin()方法,最后跳转到登录页面

2.2 mvc.xml配置

<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path=""/>
    <bean class="com.lyx.settings.web.interceptor.LoginInterceptor"/>
    mvc:interceptor>
mvc:interceptors>
  1. path里面填要拦截的请求
  2. 拦截哪些请求?业务资源的请求,也就是WEB-INF/pages目录下的资源,各种.jsp页面,然而这些页面是不能直接访问的,我们访问的时候是通过Controller的方法返回值去访问的,然而Controller的方法的@RequestMapping(“”),这里面的路径,是根据当前方法返回值要访问的jsp页面所在的目录+当前方法名+.do来定义的

CRM-拦截器_第3张图片

  1. jsp页面所在的目录

CRM-拦截器_第4张图片

  1. 所以拦截路径就可以直接写
 <mvc:interceptors>
        <mvc:interceptor>
            
            <mvc:mapping path="/setting/**"/>
            <mvc:mapping path="/workbench/**"/>
            
            <mvc:exclude-mapping path="/settings/qx/user/toLogin.do"/>
            <mvc:exclude-mapping path="/settings/qx/user/login.do"/>
            <bean class="com.lyx.settings.web.interceptor.LoginInterceptor"/>
        mvc:interceptor>
    mvc:interceptors>
  1. UserController的toLogin()方法和login()方法不用拦截,因为这个两个方法一个就是访问登录页面的,一个是登录验证的,不需要进行拦截

你可能感兴趣的:(CRM,java,mvc,开发语言)