Session过滤器简单举例讲解

本文介绍Session过滤器的创建与配置,通过实例展示如何利用Session过滤器判断用户登录状态,阻止未登录用户访问特定页面,同时排除静态资源的拦截。深入探讨过滤器在批处理中的应用及request与response的正确转换。

Session过滤器简单讲解

创建和配置

Session过滤器的相关xml配置以及创建过程详见我的上一篇文章:https://blog.youkuaiyun.com/jordan_wzg/article/details/104970795
里边详细的解说了两种过滤器的配置过程以及相应的优缺点分析。

功能实现:

举例说明Session过滤器的相关运用:判断是否登录,不登录无法查看相关页面的内容,同时需要排除拦截一些页面,包括.css、.jpg、.js等

代码如下:

doFilter方法下:

//定义平常的request和response
HttpServletRequest req=(HttpServletRequest )request;
HttpServletResponse res=(HttpServletResponse )response;
//获取当前页面Session对象
HttpSession session =req.getSession();
//获取当前页面访问路径
String path = req.getServletpath();
//path.endwith();排除拦截
if((Session.getAttribute("userMap")!=null||Session.getAttribute("clientMap")!=null)||path.endwith("login.jsp")||path.endwith(".css"));
	chain.doFilter(request,response);
else{
	//当前页面的编码方式
	res.SetContentType("text/html; charset=utf-8");
	PrintWriter out = res.getWriter();
	out.print("<script>alter('请登录!');windows.top.location.href='login.jsp';</script>");
}	


总结:

本文只是简单的介绍了Session过滤器的一种用法,更多的用法需要大家自己去探索,必须要说的是:

1、大家一定要了解过滤器的最基础的定义和创建方式,文章只是从“批处理”讲解了一下过滤器的批量判定session是否有值。

2、注意session过滤器使用时的request以及response转变,需要重新定义新的变量为我们常用的response和request对象,方能使用对象方法。

更多讨论大家评论区见!

<think>好的,用户之前让我整理Python常见的面试题分类,现在他进一步要求把答案和讲解也发出来。我需要先回顾之前的回答结构,确保新的内容能够对应上之前的分类,同时补充详细的解析。 首先,用户可能是在准备面试,需要更深入的理解每个问题的答案和背后的原理。之前的分类有基础语法、核心概念、进阶问题、代码实战、高频库和项目经验。现在每个部分都需要添加答案和讲解部分。 接下来,我需要考虑如何组织每个问题的答案。例如,在基础语法中的动态类型问题,不仅要回答合法,还要解释Python的动态特性。对于可变和不可变对象,要举例说明,比如列表和元组的区别,并提到哈希性的影响。 然后,装饰器的问题需要给出一个示例代码,并逐步解释装饰器的工作原理,包括闭包和函数作为参数传递的概念。生成器部分要对比return和yield的区别,说明生成器的惰性求值特性。 在面向对象部分,类变量和实例变量的区别,可能需要用示例代码展示,并说明self的作用。魔术方法部分要解释__init__和__str__的用途,以及如何自定义类的行为。 内存管理中的引用计数和循环引用问题,需要解释GC模块如何处理循环引用,以及为什么需要手动管理某些资源。GIL的问题要说明其对多线程的影响,以及如何通过多进程或协程来规避。 代码实战题如快速排序,需要解释分治策略,以及代码中每个部分的作用,比如基准值的选择,左右子数组的递归排序。设计模式如单例模式,要说明如何通过__new__方法控制实例的创建。 高频库的问题,比如requests的使用,给出一个GET请求的示例,并说明常见参数。pandas部分可以展示DataFrame的基本操作,如读取数据、过滤和聚合。 项目经验方面,用户可能需要知道如何结构化回答,比如描述复杂bug时要包括问题现象、排查过程、解决方法和学到的经验。性能优化部分要提到具体措施,如算法优化、并行处理、缓存等。 最后,要确保补充的答案准确,语言简洁,避免错误。可能需要检查每个知识点的正确性,比如装饰器的正确写法,生成器的执行流程,深拷贝和浅拷贝的区别等。同时,保持回答的结构清晰,便于用户理解和记忆。</think>以下是Python常见面试题的详细解答与解析,采用分类讲解模式: $$基础语法篇$$ **1. 变量与数据类型** Q:动态类型特性示例 A:合法。Python是动态类型语言,变量类型在运行时确定,可以重新绑定到不同类型对象 ```python a = 5 # 此时a指向int对象 a = "hello" # 现在指向str对象,原始int对象会被GC回收 ``` **2. 可变与不可变对象** Q:列表与元组的区别 A:列表是可变对象(元素可修改),元组不可变(创建后不能修改) - 示例对比: ```python lst = [1,2,3] lst[0] = 5 # 合法 tup = (1,2,3) tup[0] = 5 # 抛出TypeError ``` - 不可变对象才能作为字典的键(因为哈希值不变) $$核心概念篇$$ **3. 装饰器原理** Q:实现记录执行时间的装饰器 A:函数包装的典型实现 ```python import time def timeit(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) print(f"{func.__name__}执行耗时: {time.time()-start:.4f}s") return result return wrapper @timeit def myfunc(n): return sum(range(n)) ``` 解析要点: - 装饰器本质是高阶函数(接收函数作为参数) - 通过闭包保存原始函数引用 - @语法糖等价于myfunc = timeit(myfunc) **4. 生成器原理** Q:生成器与普通函数区别 A:通过yield关键字实现惰性计算 ```python def gen_even(): n = 0 while True: yield n n += 2 even_gen = gen_even() print(next(even_gen)) # 0 print(next(even_gen)) # 2 ``` 关键特性: - 每次next()执行到yield暂停 - 保留函数执行状态 - 节省内存(对比一次性生成全部元素的列表) $$进阶问题篇$$ **5. GIL全局解释器锁** Q:对多线程的影响 A:虽然Python支持多线程,但由于GIL存在,同一时刻只有一个线程执行字节码 - 解决方案: - CPU密集型任务使用多进程(multiprocessing) - I/O密集型任务可用多线程(threading)或协程(asyncio) - 调用C扩展(如numpy运算会释放GIL) **6. 内存管理** Q:循环引用如何处理 A:使用gc模块的自动回收机制 ```python import gc class Node: def __init__(self): self.parent = None # 创建循环引用 a = Node() b = Node() a.parent = b b.parent = a # 手动触发垃圾回收 gc.collect() # 会回收这两个对象 ``` 注意点: - 引用计数无法处理循环引用 - 分代回收策略减少扫描开销 - 有__del__方法的对象可能无法被回收 $$代码实战篇$$ **7. 单例模式实现** Q:使用__new__方法控制实例创建 A:经典实现方式 ```python class Singleton: _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance a = Singleton() b = Singleton() print(a is b) # 输出True ``` 实现原理: - 重写实例创建入口方法__new__ - 类变量_instance保存唯一实例 - 保证多次实例化返回同一对象 **8. 列表去重** Q:高效实现列表元素去重 A:三种常用方法对比 ```python # 方法1:利用集合特性(不保证顺序) lst = [3,2,2,1,5,4,4] unique1 = list(set(lst)) # 方法2:保持原始顺序 unique2 = [] seen = set() for x in lst: if x not in seen: seen.add(x) unique2.append(x) # 方法3:使用字典(Python3.7+有序字典) unique3 = list(dict.fromkeys(lst)) ``` 性能分析: - 数据量小时差异不大 - 大数据量时集合方法最快 - 需要保持顺序时选方法2或3 $$高频库使用篇$$ **9. requests库使用** Q:发送带参数的GET请求 A:典型请求示例 ```python import requests params = {'key1': 'value1', 'key2': ['v2', 'v3']} headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get( 'https://httpbin.org/get', params=params, headers=headers ) print(response.status_code) print(response.json()) # 自动解析JSON响应 ``` 关键点: - params会自动处理列表等数据结构 - headers需要字典格式 - 推荐使用Session对象保持连接 **10. pandas数据处理** Q:DataFrame常用操作 A:数据筛选与聚合示例 ```python import pandas as pd df = pd.read_csv('data.csv') # 筛选年龄大于30的记录 filtered = df[df['age'] > 30] # 按部门统计平均薪资 result = df.groupby('department')['salary'].mean() # 处理缺失值 df['age'].fillna(df['age'].median(), inplace=True) ``` 核心操作: - 布尔索引筛选 - groupby分组统计 - merge实现表连接 - apply应用自定义函数 $$项目经验篇$$ **典型问题参考回答框架** Q:描述解决过的最复杂bug A:推荐使用STAR模型: - **S**ituation:在XX项目中,支付模块出现偶发性掉单 - **T**ask:需要保证100%订单状态一致性 - **A**ction:通过日志分析发现MQ重复消费→增加幂等校验→添加补偿机制 - **R**esult:故障率从0.5%降至0.01%,建立监控报警体系 建议准备策略: 1. 技术问题:理解原理+手写代码(如实现LRU缓存) 2. 设计问题:掌握常用模式(工厂模式/策略模式应用场景) 3. 项目问题:准备3个不同难度级别的案例(简单优化/复杂问题/架构设计) 4. 行为问题:练习用简洁语言描述技术决策过程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值