利用Filter禁止直接访问JSP

时间:2021-11-13 17:12:50


一.应用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资源。