自定义 spring mvc 拦截器(近期项目需求实现)

          需求背景:特定文件夹下任何文件不经过登录,全部拦截强制跳转登录,并客户端禁止下载服务器定制文件夹文件

          经过1天多时间的各种尝试,自定义式的强大拦截器实现了,废话不说了,直接贴代码啦。

   demo:

      1>   根目录下 index.html 内容:

              <a href="html/index.html">index</a><br/>
             <a href="html/login3.html">login3.html---</a><br/>
            <a href="html/xxx.xx">xxx.xx---</a><br/>

             <a href="html/1.jpg">1.jpg---</a><br/>

             <a href="html/1.src">1.src---</a><br/>

            <a href="html/1.zip">1.zip---</a><br/>

            。。。。。任何写啦

        

       2>  dispatcher-servlet.xml

        <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--
        使Spring支持自动检测组件,如注解的Controller
    -->
<context:component-scan base-package="com.yjde.web.controller" /><!--

 
    
 
<bean  
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/html/" p:suffix=".html" /> 

--><!--<bean  
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
-->

<mvc:interceptors>
<mvc:interceptor>
<!--设置拦截的路径:具体路径的拦截-->
<!--<mvc:mapping path="/*.*" />
<mvc:mapping path="/login1.do" />
<mvc:mapping path="/login2.do" />-->

<mvc:mapping path="/*.*" />

<bean class="com.yjde.web.interceptor.TimeInterceptor">
<!--openingTime 属性指定上班时间-->
<property name="openingTime">
<value>12</value>
</property>
<!--closingTime属性指定下班时间-->
<property name="closingTime">
<value>14</value>
</property>
<!--outsideOfficeHoursPage属性指定提示页面的URL-->
<property name="outsideOfficeHoursPage">
<value>http://localhost:8080/SpringMVCInterceptor/login/login.html
</value>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors><!--

 
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="message" />
 
 
--></beans>

   3> web.xml

      <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

 
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
 
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc/*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/html/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
 
 
<!--处理从页面传递中文到后台而出现的中文乱码问题-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
 

    4> java 源码:

   package com.yjde.web.interceptor;

import java.util.Calendar;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class TimeInterceptor extends HandlerInterceptorAdapter {
// 继承HandlerInterceptorAdapter类

private int openingTime; // openingTime 属性指定上班时间
private int closingTime; // closingTime属性指定下班时间
private String outsideOfficeHoursPage;// outsideOfficeHoursPage属性指定错误提示页面的URL

// 重写 preHandle()方法,在业务处理器处理请求之前对该请求进行拦截处理
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Calendar cal = Calendar.getInstance();

System.out.println(">>"+request.getRequestURL());
System.out.println(request.getRequestURI());

int hour = cal.get(Calendar.HOUR_OF_DAY); // 获取当前时间
if (openingTime <= hour && hour < closingTime) { // 判断当前是否处于工作时间段内
return true;
} else {
response.sendRedirect(outsideOfficeHoursPage); // 返回提示页面
return false;
}
}

public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object o, ModelAndView mav)
throws Exception {
System.out.println("postHandle");
}

public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object o, Exception excptn)
throws Exception {
System.out.println("afterCompletion");
}

public int getOpeningTime() {
return openingTime;
}

public void setOpeningTime(int openingTime) {
this.openingTime = openingTime;
}

public int getClosingTime() {
return closingTime;
}

public void setClosingTime(int closingTime) {
this.closingTime = closingTime;
}

public String getOutsideOfficeHoursPage() {
return outsideOfficeHoursPage;
}

public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) {
this.outsideOfficeHoursPage = outsideOfficeHoursPage;
}

}
// 可以看出,上面的代码重载了preHandle()方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在
// openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个静态页面,返回
// false,这样该请求就不会被处理。

     5>java源码:

 package com.yjde.web.controller;

import java.io.PrintWriter;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class LoginController {

@RequestMapping(value="/{username}", method = RequestMethod.GET)
public String html(@PathVariable("username") String username,HttpServletRequest request) {
System.out.println("拦截成功:"+username);
return username;
}

}

时间: 2024-09-08 12:55:46

自定义 spring mvc 拦截器(近期项目需求实现)的相关文章

Spring MVC拦截器实现分析

Spring MVC拦截器实现分析 一.Servlet Filter与Spring interceptor的执行顺序 Filter有顺序吗?我们怎么控制filter的执行顺序.通过Tomcat的代码分析,servlet在Filter执行完成后才调用,如有多个filter怎么控制执行顺序,首先会想到在web.xml配置某个参数,例如order之类的,但查找一下一番,servlet并没有这个参数.试试filter Mapping的配置的先后顺序,果然有效,原来filter的执行顺序就考filter

spring MVC拦截器01

spring MVC拦截 作用:身份校验,权限检查,防止非法访问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法增加分类,无法删除博文. spring MVC 拦截实现分为2步 (1)编写拦截器类,必须继承org.springframework.web.servlet.HandlerInterceptor 核心方法: public boolean preHandle(HttpServletRequest request, HttpServ

Spring MVC拦截器+注解方式实现防止表单重复提交

原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过. 1.新建注解: ? /**  * <p>  * 防止重复提交注解,用于方法上<br/>  * 在新建页面方法上,设置needSaveToken()为true,此时拦截器会在Session中保存一个token,  * 同时需要在新建的页面中添加  * <input type="hidden" name

spring mvc拦截器无法拦截DWZ的请求,求指点。。。

问题描述 拦截器是这样配置的: <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/*" > </mvc:mapping>如果不配置或/*,将拦截所有的Controller <bean class="com.hangzhou.controller.interceptor.LoginInterceptor"></bean> </m

spring mvc 拦截器路径问题,只拦截固定后缀

拦截固定后缀  匹配url正确配置为 /**/*.htm     错误:**.htm    /**.htm   *.htm  <mvc:interceptors> <!-- <bean class="com.host.app.web.interceptor.AllInterceptor"/> --> <mvc:interceptor> <mvc:mapping path="/**/*.htm" /><

spring mvc拦截器页面不跳转问题

问题描述 就是不跳转到我指定的Controller上.请教大神.publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objectobject)throwsException{StringrequestPath=ResourceUtil.getRequestPath(request);//用户访问的资源地址System.out.println(requestPath+"--->访问路径&qu

spring mvc-SpringMvc拦截器配置怎么配置拦截一个网站

问题描述 SpringMvc拦截器配置怎么配置拦截一个网站 我想拦截一个网址,比如页面的地址是www.XXXX.com.配置文件怎么配? 不拦截全部,只拦截单个网址的那种 解决方案 在controller层中来配置拦截的URL @RequestMapping("configSettRule") public class SettRuleController extends BaseController{ @Resource private SettRuleManager settRul

path-spring Mvc 拦截器拦截不成功

问题描述 spring Mvc 拦截器拦截不成功 拦截不成功,各位大神帮忙看下配置有没错.这样配置可不可以拦截 解决方案 你这样太麻烦了,用springMVC的统一拦截器,然后在controller层中加注解就行了 过程如下:http://blog.csdn.net/evankaka/article/details/45501811 解决方案二: spring MVC - Inteceptors(拦截器)spring MVC - Inteceptors(拦截器) 解决方案三: ,用springM

spring security3拦截器问题

问题描述 spring security3拦截器问题 未登录系统的情况下,第一次访问页面会跳转到登录页面,第二次访问就能够访问 配置如下: <http entry-point-ref="loginAuthenticationEntryPoint" > <!-- UsernamePasswordAuthenticationFilter default-target-url 指定了从登录页面登录后进行跳转的页面 always-use-default-target true