利用Filter禁止直接访问JSP

本文介绍Struts框架的基本应用,包括如何通过配置文件实现视图和模型的映射,以及如何通过自定义Filter拦截直接访问JSP页面的请求,并将其重定向到指定的Action。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值