每个网页或请求都是一个url地址,一般,这个地址可能是.do .action .php之类的并加上'?'号、'&'号查询串等构成的一个长长的的url。不利于阅读,同时将实际的地址暴露给用户,容易遭到攻击。
一般的url----------------------------------------------------------较好的 url
http://www.xxx.net/user/profile.do?id=20001 ====> http://www.xxx.net/user/20001
http://www.xxx.net/forum/board.do?name=java ====> http://www.xxx.net/forum/java
http://www.xxx.net/forum/thread.do?id=29923 ====> http://www.xxx.net/thread/29923
后者明显较为直观和漂亮。
使用url rewrite可以很好的改善这个状况。网站url rewrite应用是非常广泛的,良好的url设计给用户带来的非常好的体验,同时也能吸引搜索引擎的注意。
一种rewrite称为一个规则,上面的例子就是3个规则。Apache HTTP Server 2.x的mod_rewrite提供了不错的Rewrite处理方法,java中有 http://tuckey.org/urlrewrite/。
下面我们用一个Filter来模拟实现。
public class RewriteFilter implements Filter {
private ServletContext ctx;
private List<RewriteEntry> entries = new ArrayList<RewriteEntry>();
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain nextFilter) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String url = req.getRequestURI();
for (RewriteEntry entry : entries) {
Matcher matcher = entry.getPattern().matcher(url);
if (!matcher.find(0))
continue;
String replacement = replace(matcher, entry.getTarget());
String query = req.getQueryString();
if (query != null) {
if (replacement.indexOf("?") > 0)
replacement = replacement + "&" + query;
else
replacement = replacement + "?" + query;
}
if (replacement.startsWith("/")) {
RequestDispatcher dispatcher = ctx.getRequestDispatcher(replacement);
dispatcher.forward(request, response);
return;
} else {
resp.sendRedirect(resp.encodeRedirectURL(replacement));
return;
}
}
// TODO 只有不匹配的情况下,程序才能运行到这里
// 这样必须把RewriteFilter配置到Filter顺序的最后
nextFilter.doFilter(request, response);
}
private String replace(Matcher matcher, String target) {
StringBuffer cb = new StringBuffer(512);
int length = target.length();
for (int i = 0; i < length; i++) {
char ch = target.charAt(i);
// target : /index.jsp?id=$1
if (ch != '$' || i == length - 1)
cb.append(ch);
else {
ch = target.charAt(i + 1);
if (ch >= '0' && ch <= '9') {
int group = ch - '0';
cb.append(matcher.group(group));
i++;
} else if (ch == '$') {
cb.append('$');
i++;
} else
cb.append('$');
}
}
return cb.toString();
}
/**
* 解析rewrite.properties文件,生辰需要rewrite的Bean
*/
public void init(FilterConfig filterConfig) throws ServletException {
ctx = filterConfig.getServletContext();
File cfgFile = new File(ctx.getRealPath("/WEB-INF/rewrite.properties"));
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(cfgFile));
String line = null;
while ((line = reader.readLine()) != null) {
if (line.trim().equals("") || line.trim().startsWith("#"))
continue;
String[] temp = line.split(" ", 2);
entries.add(new RewriteEntry(temp[0], temp[1]));
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
}
}
}
}
public static class RewriteEntry {
private Pattern pattern;
private String target;
public RewriteEntry(String pattern, String target) {
this.pattern = Pattern.compile(pattern);
this.target = target;
}
public Pattern getPattern() {
return pattern;
}
public String getTarget() {
return target;
}
}
}
web.xml文件
<web-app>
<filter>
<filter-name>rewriteFilter</filter-name>
<filter-class>demo.RewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>rewriteFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
</web-app>
/WEB-INF/rewrite.properties文件
引用
^\/index\/(.*)\.html$ /index.jsp?id=$1
^\/hello\/(.*)\.html$ /hello.jsp?name=$1
hello.jsp
<h3>Hello, <%=request.getParameter("name")%>!</h3>
index.jsp
<h3>URL: <%=request.getRequestURI()%></h3>
<h3>Query: <%=request.getQueryString()%></h3>
我们运行页面,输入
http://localhost:8888/index/xace.html
输出:
URL: /index.jsp
Query: id=xace
http://localhost:8888/hello/xace.html
输出:
Hello, xace!
分享到:
相关推荐
URLWriter 是一种用于实现 URL 重写的工具,它能够帮助开发者在不改变服务器端原有资源的情况下,对客户端显示的 URL 进行自定义设置,从而实现更加友好和易于理解的 URL 结构。本教程将详细介绍如何在项目中使用 ...
`Urlwriter` 提供了许多高级功能,如条件、拦截器、自定义函数等,可以实现复杂的需求。例如,你可以根据用户的角色或请求的参数来决定是否执行重写,或者在 URL 重写前后执行自定义逻辑。 条件可以用来进一步细化...
Kotlin-记事本项目代码(android+kotlin)
车牌识别
在当今数字化浪潮中,园区智慧化建设正成为推动区域经济发展和产业转型升级的关键力量。这份园区智慧化解决方案全面展示了如何通过集成大数据、云计算、物联网(IoT)、人工智能(AI)、地理信息系统(GIS)和建筑信息模型(BIM)等前沿技术,为传统产业园区插上数字的翅膀,打造“数字创新”产业园区。 数字技术赋能,重塑园区生态 传统产业园区往往面临运营效率低下、管理粗放、资源利用率不高等问题。而通过智慧化改造,园区可以实现从“清水房”到“精装房”的华丽蜕变。数字化技术不仅提升了园区的运营管理水平,降低了运营成本,还显著增强了园区的竞争力和吸引力。例如,通过构建园区数字模型(CIM),实现了多规数据融合,形成了园区规划“一张图”,为园区管理提供了直观、高效的可视化工具。此外,智能感知设施的应用,如环境监测、能耗监测等,让园区管理更加精细化、科学化。智慧能源管理系统通过实时监测和智能分析,帮助园区实现低碳绿色发展,而综合安防管控系统则通过AI+视频融合技术,为园区安全保驾护航。更有趣的是,这些技术的应用还让园区服务变得更加个性化和便捷,比如园区移动APP,让企业和员工可以随时随地享受园区服务,从会议室预定到智慧公寓管理,一切尽在“掌”握。 智慧运营中心,打造园区大脑 园区智慧化建设的核心在于构建智慧运营中心,这可以看作是园区的“数字大脑”。通过集成物联网服务平台、大数据分析平台、应用开发赋能平台等核心支撑平台,智慧运营中心实现了对园区内各类数据的实时采集、处理和分析。在这个“大脑”的指挥下,园区管理变得更加高效、协同。比如,建设工程项目智慧监管系统,通过基于二三维GIS底图的统一数字化监管,实现了对园区在建工程项目的进度控制、质量控制和安全控制的全方位监管。可视化招商系统则利用CIM模型,以多种方式为园区对外招商推介提供了数字化、在线化的展示窗口。而产业经济分析系统,则通过挖掘和分析产业数据,为园区产业发展提供了有力的决策支持。智慧运营中心的建设,不仅提升了园区的整体运营水平,还为园区的可持续发展奠定了坚实基础。 产业服务升级,激发创新活力 园区智慧化建设不仅关注基础设施和运营管理的升级,更重视产业服务的创新。通过整合平台资源、园区本地资源和外围资源,打造园区服务资源池,为园区内的企业和个人提供了全面的智慧管理、智慧工作和智慧生活服务。特别是工业互联网平台和工业云服务的建设,为园区内的企业提供了轻量化、智能化的生产服务。这些服务涵盖了车间信息化管理、云制造执行、云智能仓储、设备健康管理等多个方面,有效提升了企业的生产效率和竞争力。此外,通过产业经济分析系统,园区还能够对潜在客户进行挖掘、对经销商进行风控、对产品销量进行预测等,为企业的市场营销提供了有力支持。这些创新的产业服务,不仅激发了园区的创新活力,还为区域经济的转型升级注入了新的动力。总之,园区智慧化建设是一场深刻的变革,它正以前所未有的方式重塑着园区的生态、运营和服务模式,为园区的可持续发展开辟了广阔的前景。
Redmine Tags plugin (Light version) 可自定义issue标签插件 可设置ISSUE标签 并设置根据标签查询 1.验证通过版本redmine5.0.4 2.解压tar包至redmine/plugins目录重启redmine即可
车牌识别项目
powerDesigner报告模板
python、yolo、pytorch
车牌识别项目
a8cce16fd8df855fa808c72133df2b4a_1741769036387_1
33559399361500导师评价.zip
该资源为jaxlib-0.4.18-cp311-cp311-macosx_10_14_x86_64.whl,欢迎下载使用哦!
学号+姓名+实验二.ipynb
机器人项目-基于STM的智能引导车code(用户引导残障人士)
亲测柚子社区团购源码V1.6.2 小程序开源版+前端(已亲测可安装使用) 是以微信为载体整合多个社区社群资源,形成由商家集中化管理运营的预售 团购的社区商业模式。 主要销售场景是由各快递代收点、社区便利店、社区物业、业主等发起的社区微信群,每个群都相当于一个社区店。
python、yolo、pytorch
系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
图像处理项目实战
blob_from_images opencv dnn