利用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进行处理。因此拦截jspfilter应当位于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,通过actionjsp的映射来访问相应的jsphtml资源。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。