NutzCN Logo
问答 关于filter的拦截
发布于 3003天前 作者 老司机 3104 次浏览 复制 上一个帖子 下一个帖子
标签:

为什么

 <filter-mapping>
      <filter-name>nutz</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

是可以的但是

 <filter-mapping>
      <filter-name>nutz</filter-name>
      <url-pattern>/nutz/*</url-pattern>
  </filter-mapping>

就会404?我是二次开发,需要在原有项目里加nutz框架,实现自己的功能,所以这能拦截特定的url比如这个nutz

14 回复

访问什么的时候404,后台出什么日志

来自炫酷的 NutzCN

另外, 可以配置exclusions来忽略一些路径, 或者更狠一点的, 继承NutFilter,覆盖isExclusion!!

访问

http://localhost:8080//mySmartDC/nutz/entity/test

报404,后台

2016-9-2 11:1:14.844 DEBUG [http-nio-8080-exec-2] Search mapping for path=/nutz/entity/test : NOT Action match

改成

<filter-mapping>
      <filter-name>nutz</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

后,访问

http://localhost:8080//mySmartDC/entity/test

成功返回

@wendal 这是整个正确的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>mySmartDC</display-name>
  <filter>
      <filter-name>nutz</filter-name>
      <filter-class>org.nutz.mvc.NutFilter</filter-class>
      <init-param>
          <param-name>modules</param-name>
          <param-value>net.myDCM.MainModule</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>nutz</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

就改下url就不行了为啥啊

哦,老issue了, 需要加前缀

@wendal 能麻烦详细说下吗?能附代码不?

这样写

@At("/nutz")
public class MainModule {}

不过,我还是建议用exclusions或者继承NutFilter

继承了NutFilter,然并卵,一样404@wendal

package filter;

import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

import org.nutz.mvc.NutFilter;

@WebFilter(urlPatterns="/nutz/*",initParams={@WebInitParam(name="modules",value="net.myDCM.MainModule")})
public class NutzFilter extends NutFilter{

}

核心问题就是: 当前版本的NutFilter,总是按全路径匹配, 没有去掉前缀.

可选方法如下:

方案一: 在MainModule加@At("/nutz")
方案二: 写/*, 让NutFilter全部过滤
方案三: 写/*, 继承NutFilter,然后覆盖isExclusion方法自定义

@wendal 官方文档如是云:

Nutz 中的目录匹配 - /abc/*
如果请求为:

http://localhost:8080/testweb/abc/getlist.nut
对于 Nutz.Mvc 我们需要匹配的部分为:

/getlist
这里需要说明的是,可能人们会怀疑,为什么目录匹配的时候,只匹配 getlist 而不匹配 abc/getlist 呢? 因为,你在你的 web.xml 声明了这样的 url-pattern:

...
/abc/*
...
显然,你希望在 web.xml 来决定你的 URL 前面那部分,所以后面一部分就交给 Nutz.Mvc 来匹配吧。否则,你修改了 web.xml 的时候,你还需要修改 Nutz.Mvc 的配置,这与显然我们设计的初衷不符,Nutz.Mvc 设计的基本要求就是:

如果用户修改了 web.xml 或者 server.xml,不需要用户重新修改 Nutz.Mvc 相关的配置
但是我照做了就报404,why?

因为这个bug一直没有fix

改用NutServlet

来自炫酷的 NutzCN

添加回复
请先登陆
回到顶部