jeecms 前台拦截器的研究与改造

jeecms源码下载 立即下载

jeecms出发点是面向大众的,具有前台开发性,也就是说,即时是未登录(游客),也可以浏览到前台页面的内容,只是有些操作需要(增删改)注册和登录之后才可以进行。

后台当然不能随便进入了,必须登录后才可以进入后台,那么jeecms是怎么做的呢?我们看一看源码。

后台拦截器代码:

@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// 获得站点
		CmsSite site = getSite(request, response);
		CmsUtils.setSite(request, site);
		// Site加入线程变量
		CmsThreadVariable.setSite(site);

		// 获得用户
		CmsUser user = null;
		if (adminId != null) {
			// 指定管理员(开发状态)
			user = cmsUserMng.findById(adminId);
			if (user == null) {
				throw new IllegalStateException("User ID=" + adminId
						+ " not found!");
			}
		} else {
			// 正常状态
			Integer userId = authMng
					.retrieveUserIdFromSession(session, request);
			if (userId != null) {
				user = cmsUserMng.findById(userId);
			}
		}
		// 此时用户可以为null
		CmsUtils.setUser(request, user);
		// User加入线程变量
		CmsThreadVariable.setUser(user);
                //用户校验开始
		String uri = getURI(request);
		// 不在验证的范围内
		if (exclude(uri)) {
			return true;
		}
		// 用户为null跳转到登陆页面
		if (user == null) {
			response.sendRedirect(getLoginUrl(request));
			return false;
		}
                //未登录用户重定向,用户校验结束
                 // 用户不是管理员,提示无权限。
		if (!user.getAdmin()) {
			request.setAttribute(MESSAGE, MessageResolver.getMessage(request,
					"login.notAdmin"));
			response.sendError(HttpServletResponse.SC_FORBIDDEN);
			return false;
		}
		// 不属于该站点的管理员,提示无权限。
		if (!user.getSites().contains(site)) {
			request.setAttribute(MESSAGE, MessageResolver.getMessage(request,
					"login.notInSite"));
			response.sendError(HttpServletResponse.SC_FORBIDDEN);
			return false;
		}
		boolean viewonly = user.getViewonlyAdmin();
		// 没有访问权限,提示无权限。
		if (auth && !user.isSuper()
				&& !permistionPass(uri, user.getPerms(), viewonly)) {
			request.setAttribute(MESSAGE, MessageResolver.getMessage(request,
					"login.notPermission"));
			response.sendError(HttpServletResponse.SC_FORBIDDEN);
			return false;
		}
		return true;
	}
两行红色注释之间的代码,就是用来校验用户是否存在,用户信息是否有效的,这几句代码的功能可以分以下几个点来叙述:

1,获取请求uri并作处理,检测该uri是否符合要求,若不符合抛出异常。

2,如果当前请求的uri是例外的,放行,不做拦截,这里主要是对登录和登出的uri放行,防止死循环。

3,如果当前请求没有登录用户,则重定向到登录页。

具体的参数信息可以查看配置文件:jeecms-servlet-admin.xml

<bean id="adminContextInterceptor" class="com.jeecms.cms.web.AdminContextInterceptor">
		<property name="auth" value="true"/>
		<property name="loginUrl" value="/jeeadmin/jeecms/login.do"/>
		<property name="returnUrl" value="/jeeadmin/jeecms/index.do"/>
		<property name="excludeUrls">
			<list>
				<value>/login.do</value>
				<value>/logout.do</value>
			</list>
		</property>
	</bean>

整个重定向功能就是这样,那么我们前台也想要这种效果,不登陆用户不可以浏览任何页面,并定向到登陆页让其登录去,怎么办呢?

很简单了,比葫芦画瓢就是了。

首先我们找到前台url的拦截器:FrontContextInterceptor.java

public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler)
			throws ServletException {
		CmsSite site = null;
		List<CmsSite> list = cmsSiteMng.getListFromCache();
		int size = list.size();
		if (size == 0) {
			throw new RuntimeException("no site record in database!");
		} else if (size == 1) {
			site = list.get(0);
		} else {
			String server = request.getServerName();
			String alias, redirect;
			for (CmsSite s : list) {
				// 检查域名
				if (s.getDomain().equals(server)) {
					site = s;
					break;
				}
				// 检查域名别名
				alias = s.getDomainAlias();
				if (!StringUtils.isBlank(alias)) {
					for (String a : StringUtils.split(alias, ',')) {
						if (a.equals(server)) {
							site = s;
							break;
						}
					}
				}
				// 检查重定向
				redirect = s.getDomainRedirect();
				if (!StringUtils.isBlank(redirect)) {
					for (String r : StringUtils.split(redirect, ',')) {
						if (r.equals(server)) {
							try {
								response.sendRedirect(s.getUrl());
							} catch (IOException e) {
								throw new RuntimeException(e);
							}
							return false;
						}
					}
				}
			}
			if (site == null) {
				throw new SiteNotFoundException(server);
			}
		}
		
		CmsUtils.setSite(request, site);

		CmsUser user = null;
		Integer userId = authMng.retrieveUserIdFromSession(session, request);
		if (userId != null) {
			user = cmsUserMng.findById(userId);
		}
		
		if (user != null) {
			CmsUtils.setUser(request, user);
		}
		return true;
	}

拦截器很简单,并没有在检测到用户无效后做任何措施,不管怎样都是放行的,那么我们就在最后一个if路面添加else,也就是说if(user==null)我们就做些事情:

其配置文件jeecms-servlet-front.xml并没有对该拦截器配置参数,那么我们就自己来配置,当然要仿照后台的拦截器来配:

<bean id="frontContextInterceptor" class="com.jeecms.cms.web.FrontContextInterceptor">
		<property name="loginUrl" value="/login.jspx"/>
		<property name="returnUrl" value="/tjhq"/>
		<property name="excludeUrls">
			<list>
				<value>/login.jspx</value>
				<value>/logout.jspx</value>
			</list>
		</property>
	</bean>

loginUrl是登录页的url,returnUrl指的是登陆后进入的url,而excludeUrls是例外情况,也就是说碰到这两个url都放行。

最后一个if改为:

if (user != null) {
			CmsUtils.setUser(request, user);
		}else{
			String uri = getURI(request);
			// 不在验证的范围内
			if (exclude(uri)) {
				return true;
			}
			// 用户为null跳转到登陆页面
			if (user == null) {
				try {
					response.sendRedirect(getLoginUrl(request));
				} catch (IOException e) {
					e.printStackTrace();
				}
				return false;
			}
		}
当然了,getURI,exclude,getLoginUrl这样的方法都是没有的,从后台拦截器文件中直接拷贝过来,简单做些修改就可以用了。

这样,我们的前台页面也跟后台一致了,都实现了登录重定向功能。

JEECMS修改后台地址 JEECMS后台地址修改:JEECMS修改后台地址比较麻烦,按照文档上的步骤操作可以进行修改 立即下载

相关推荐

JEESITE登录流程简单梳理

sysLogin.jsp登录: spring-context-shiro.xml中shiro安全认证过滤器: --> 用户登录提交后,先指定了formAuthenticationFilter进行过滤,如果过滤认证成功,则访问/a/login。 FormAuthenticationFilter根据用户登录

行云流水Gz的专栏 6854

2023-ICCV-隐式神经网络实现低光照图像增强(NeRCo)论文解读+代码解析

NeRCo()提出了一种名为NeRCo的隐式神经表示方法,用于合作式低光图像增强。现有的低光图像增强方法存在以下三个限制:不可预测的亮度降低和噪声、度量友好版本和视觉友好版本之间的固有差距,以及有限的配对训练数据。为了解决这些限制,论文提出了NeRCo方法,它以无监督的方式稳健地恢复感知友好的结果。具体而言,NeRCo通过一个可控的拟合函数统一了现实场景中多样的退化因素,从而提高了鲁棒性。对于输出结果,论文引入了来自预训练视觉-语言模型的先验信息,采用语义导向的监督方法。

weixin_45595504的博客 3184

jeecms前台登录后跳转其他页面,退出登录到其他页面

1、参照页面跳转DynamicPageAct下的dynamic方法,将需要登录后跳转的页面单独写一个 /** * 动态页入口 */ @RequestMapping(value = "/**/*.*", method = RequestMethod.GET) public String dynamic(HttpServletRequest request, HttpServlet...

baidu_29609779的博客 860

ArcGIS数据处理必备技能:从地理坐标到UTM投影的面转栅格完整流程

本文详细介绍了在ArcGIS中从地理坐标到UTM投影的面转栅格完整流程,包括坐标系转换、像元大小设置及质量控制等关键步骤。通过实战案例和Python脚本示例,帮助用户解决常见问题并优化数据处理效率,特别适合需要精确GIS数据分析的专业人士。

weixin_42628688的博客 180

BIOS更新后PIN不可用怎么办?从原理到实操的完整修复指南

在计算机维护中,BIOS更新是常见的固件升级操作,但其引发的登录异常却常让用户措手不及。Windows Hello PIN并非传统密码,它通过TPM芯片与设备启动环境(PCR状态)强绑定,一旦主板固件或安全启动配置改变,TPM便会拒绝释放密钥,导致“由于此设备上的更改,你的PIN不再可用”。理解这一原理后,恢复路径清晰可控:优先尝试密码登录,或通过WinRE替换utilman.exe创建临时管理员,必要时还需处理BitLocker恢复密钥。本文面向系统维护与数据安全场景,系统梳理PIN失效的恢复流程与避坑方

weixin_31364787的博客 365

JEECMS v3.0.1 beta版源码分析2

JEECMS v3.0.1 beta版发布,采用的是采用hibernate3+spring mvc+spring2+freemarker主流技术架构. 再对前台配置文件进行分析jeecms-servlet-front.xml 加载的资源文件 /WEB-INF/lang...

nowdown的博客 162

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

jeeCmsV7-src 源码解析之七(前台页面初始化是request赋值)

问题:当输入http://localhost:8070/jeeCms/时,通过拦截器“/”后台时,request 中包含了很多值是哪里来的? 回答:  1、加载web.xml JeeCmsFront org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WE

nipanlong001的专栏 879

RISC-V详细介绍

文章目录写在前面什么是RISC-VRISC-V诞生的背景ISA霸权摩尔定律的穷途末路穷困潦倒的学者不断增长的指令数量RISC-V架构设计思想如何设计一个好的ISARISC-V之RV32I四个典型特点RISC-V之乘除法指令指令格式用乘法代替常数除法RISC-V之RV64RISC-V的特权架构机器模式监管者模式 写在前面 本文主要基于RISC-V中文手册,其中包括但不限于一些网络的资料。本文版权属于skywf,转载或借用请联系作者。 什么是RISC-V RISC-V(发音为“risk-five”)是一个基于

skywf的博客 3万+

34、Text2KGBench与GeoQuestions1089:知识图谱生成与地理空间问答的新进展

本文介绍了Text2KGBench和GeoQuestions1089在知识图谱生成与地理空间问答领域的最新进展。Text2KGBench提供了一个开放且可复现的基准,用于从文本生成知识图谱,并结合多个LLM模型和评估工具推动研究。GeoQuestions1089是目前最大的地理空间问答数据集,与GeoQA2系统结合,推动了地理空间问答系统的发展。文章还探讨了技术挑战和未来研究方向,包括多模态知识图谱生成和深度学习优化的地理空间问答系统。

css33的专栏 114

CMS 源码解读

CMS 是”Content Management System” 的缩写,意为” 内容管理系统”。 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场。对于内容管理,业界还没有一个统一的定义,不同的机构有不同的理解。 · 基于 java 技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点 · 采用 SpringMVC3+Spring3+Hibernate3+...

weixin_30363981的博客 572

你分得清ChatGPT、Gemini、Grok、豆包、千问、DeepSeek、OpenClaw、CloudCode、vibeCodeing、sKill、MCP,飞书、微信这些到底是什么吗?

AI技术生态呈现层级化发展,从基础模型到应用平台形成完整技术栈。核心分为五层:模型层(GPT、Gemini等基础模型)→AI助手层(ChatGPT等应用产品)→工具层(ClaudeCode等开发工具)→协议层(MCP等接口标准)→应用层(微信、飞书等平台)。未来趋势将形成"模型公司-开发框架-应用生态"三层结构,AI正逐步演变为新型操作系统,通过标准化协议连接各类外部系统,实现能力调用与生态整合。技术发展呈现出从底层基础设施到上层应用场景的垂直整合特征。

hy行者勇哥的博客 397

CDI(Weld)高级<2> Interceptors(拦截器)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34292287的博客 298

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JEECMS——过滤器和拦截器

JEECMS的源码下载及安转运行,JEECMS项目包结构,JEECMS项目入口web.xml配置,JEECMS的过滤器和拦截器,JEECMS安全框架Shiro,JEECMS模板引擎Freemarker,JEECMS持久层框架Hibernate,JEECMS搜索引擎Lucene, JEECMS定时任务Quartz,JEECMS缓存Ehcache,JEECMS日志系统Logbac,JEECMS后台管理系统之内容,栏目模块

枣面包的博客 3279

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jeecms框架单点登录功能的实现

单点登录的功能实现主要

小汉子 4617

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Jeecms源码分析(二)

普通用户登录 在浏览器输入:http://localhost:8080   对应web.xml &lt;!-- Spring 刷新Introspector防止内存泄露 --&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.util.IntrospectorCleanupListe...

iteye_3398的博客 342

转jeecms中一些分析

 1. 拦截器: 后台管理拦截器:com.jeecms.cms.web.AdminContextInterceptor 前台拦截器:FrontContextInterceptor 都会把site信息和user信息设置到request和线程变量中 2. UnifiedUser: 用户信息及登录信息表,记录用户基本信息及最后一次登录的信息 Authentication: 记录每次的登录信息 认...

iteye_10465的博客 355

SpringMVC之Interceptor拦截器之登录拦截器

SpringMVC的拦截器是主要作用是拦截用户请求到后台之间的请求,在进入后台之前可以对其进行权限认证和用户登录的限制。 1.定义拦截器; springmvc中拦截器中主要有两种方式:第一种是实现HandleInterceptor接口,重写里面的方法;第二种是实现WebRequestInterceptor接口,同样的重写里面的方法,实现自己自定义的逻辑处理。 1、实现handleInterc

ZT的专栏 6249

java 前台登录,后台登录,Filter验证,Springmvc拦截器

在 filter中 直接在servlet上 @FilterServlet("") 想讲思路吧》 转载---------------》 FIlter https://www.cnblogs.com/oumyye/p/4273330.html ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201103075213198.png#pic_center 这个文件夹下放后端页面 拦截访问 这个文件夹下放后端的登录页面 如果想访问后台,需要登录,登录的变量存到houUser不

aaaaaaddddsssss的博客 469

Jeecms项目遇到问题集

(1)修改菜单,让栏目出现更多的菜单项目,或者更换菜单背景,只需要修改layout.css /* nav ----------------------------------------*/ #menu{background:url(../img/dhlGB.gif) repeat-x;  height:40px; width:980px;} #topmenu{display:inline

liangyixin19800304的专栏 2024

使用Crowd进行单点登录

单点登录:(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 单点登录网络生活中随处可见,比如登录了QQ客户端,然后你可以打开腾讯微博,QQ空间,QQ邮箱,校友录等等一系列的应用,这时候我们不需要在一个个再输入用户名和密码了,作为受信任的站点,就可以直接登录了。这些

xinfei0803的专栏 2万+
上一篇: spring web.xml配置有话说
下一篇: 年终一篇非技术总结
xinfei0803
博客等级 码龄17年 188粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值