利用Filter禁止直接访问JSP
一.应用Struts
Struts作为一种Web MVC框架,将视图展示和处理逻辑分离,降低耦合性,允许更改界面视图而不用重新编译逻辑部分,同样由于业务需求的改变需要调整逻辑结构而不用修改视图部分。由于灵活的配置,简单可操作性,在业界得到广泛的应用。用户通过配置Struts.xml文件,轻易建立视图和模型的映射关系。
Exmaple:
<package name=”Student” namespace=”/Student” extends=” struts-default”> <action name=”add” class=”com.struts.action.Student” method=”add”> <result>/Student_Add.jsp</result> </action> <action name=”add_test” class=”com.struts.action.Student” method=”add”> <result>/Student_Add.jsp</result> </action> </package>
在Struts.xml配置文件中作出如上配置,用户在浏览器地址栏中输入http://xxx/Student/add时,实际上就是访问Student_Add.jsp,而访问http://xxx/Student/add_test 时实际也是访问Student_Add.jsp,执行的业务逻辑是com.struts.action.student类中的add方法。
二.访问JSP
在应用Struts框架的程序中通常是通过Action来访问资源,但是直接访问jsp也是可行的。Struts提供了许多Web元素来提高开发者的效率。在直接访问包含Struts Web元素的jsp页面时通常会引入异常,比如OGNL异常。有时出于安全性考虑,也会禁止用户直接访问jsp页面。
禁用用户直接访问jsp的方式有几种,既然项目使用Struts,我们应当采用和Struts一致的方式来实现。
三.Filter过滤JSP
我们知道Struts就是基于Filter来过滤拦截客户端request的,同样我们可以自定义Filter来实现特殊过滤,比如说过滤jsp请求。其语法格式如下:
Filter定义,包括名字和实际处理类。
<filter> <filter-name>URLfilter</filter-name> <filter-class>com.struts.filter.MyURLFilter</filter-class> </filter>
Filter 过滤定义,包括名字和拦截的模式匹配<也可以是Servlet name>
<filter-mapping> <filter-name>URLfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Filter和其出于Web.xml的顺序是有关的,filter定义必须位于filter-mapping的前面,在多个url-pattern匹配的情况下,按照filter-mapping出现的先后顺序依次使用filter进行处理。因此拦截jsp的filter应当位于Struts filter前面。
下面来看filter处理类。
package com.struts.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyURLFilter implements Filter{ public void destroy() { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterchan) throws IOException, ServletException { System.out.println("My filter begin to "); HttpServletRequest httpReq =(HttpServletRequest)req; //转换成HttpServletRequest,以获取包含的地址信息,请求的参数,提交的数据 String Url = httpReq.getRequestURI(); if(Url.endsWith(".jsp")){ //判断URL以jsp结尾 System.out.println(".jsp was filtered!"); HttpServletResponse httpRes =(HttpServletResponse)res; System.out.println(httpReq.getContextPath());
httpRes.sendRedirect(httpReq.getContextPath()+"/Student/add/"); //重定向到某个action return; }else{ filterchan.doFilter(req, res); } } public void init(FilterConfig arg0) throws ServletException { System.out.println("Myfilter init!"); } }
这样,所有对jsp的直接请求都会被拦截并重定向到某个action,通过action与jsp的映射来访问相应的jsp或html资源。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。