1. 啟動項目時如何實現不在鏈接里輸入項目名就能啟動?
修改Tomcat配置文件 server.xml。找到自己的項目配置 :
<Context docBase="oneProject" path="/one Project" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>
改為如下配置:
<Context docBase="oneProject" path="/" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>
經過這樣的修改,項目就可以在啟動服務器后不用輸入項目訪問了。
2. 1分鍾之內只能處理1000個請求,你怎么實現,手撕代碼?
我知道的有兩種方式可以實現:
a). Application 對所有用戶訪問的次數計數。同時定義一個計時器,單位為一分鍾。如果Application 中的用戶在單位時間內超出請求次數,就拒絕處理該請求。一分鍾再刷新application的值為0.
使用一個Map 維護變量:
// 泛型 String 表示用戶標識,List中存放用戶不同請求的時間戳。 private Map<String, List<Long>> map = new ConcurrentHashMap<>();
我們只需要在單位計數中判斷 List中數量是否超出限制即可。
b). 使用 aop 實現請求的限制,在需要限制的請求方法上加上 aop 邏輯。即可實現,思路如下:
自定義注解類實現請求限制的攔截邏輯,在需要限制的方法上使用注解,超出限制后拒絕處理請求。
3. 什么時候用assert
在開發和測試過程中,很多時候我們需要對某些場景進行判斷,當這個判斷滿足我們預期的答案,才繼續往下執行,否則提出程序或者發出警告。assert就是這樣的功能,滿足判斷時返回true,否則返回false。但是真正到系統上線的時候,這些assert是不要使用的。
4. java 應用服務器有哪些?
Java 的應用服務器很多,從功能上分為兩大類,JSP 服務器和 Java EE 服務器,也可分其他小類。相對來說 Java EE 服務器的功能更加強大。我平時就用Tomcat。
<input type="hidden" id="xxx" value="xxx">
在表單的提交中,加入這樣一段數據提交的隱藏域,用戶在輸入時是看不到的,但是可以通過查看網頁源代碼來看到,在服務端只能通過post的方式獲取參數。這種方式在禁用Cookie的情況下也能工作,但是關閉瀏覽器后就會失效。
http://www.XXX.com/news?id=xxxx
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doGet(req, resp); // 新建一個Cookie Cookie cookie = new Cookie("name", "pwd"); // 設置Cookie的生命周期 cookie.setMaxAge(Integer.MAX_VALUE); // 將Cookie發送到客戶端 resp.addCookie(cookie); // Cookie的修改,創建一個和已有的cookie同名,然后再添加到客戶端,自動修改 Cookie secCookie = new Cookie("name", "newPwd"); resp.addCookie(secCookie); // cookie修改 // cookie的刪除, 創建一個和已有的cookie同名,並設置maxAge為0,添加到客戶端,就會自動刪除 Cookie thirCookie = new Cookie("name", "thirPwd"); thirCookie.setMaxAge(0); // 修改生命周期為0 resp.addCookie(thirCookie); // 刪除客戶端cookie }

但客戶端訪問.html 等靜態資源時,不涉及將JSP編譯為Servlet,因此Session不會創建。當客戶端第一次訪問JSP頁面時,服務器端將創建一個Session並保存在內存中,同時為客戶端返回一個sessionID,以供客戶端下次請求應用的時候帶着sessionID來表明自己的身份。一次會話一個Session,Session通過sessionID來唯一標識。同時Session默認是在服務器的內存中維護的(雖然我們可以通過技術將session持久化),因此Session的長度不宜太大(雖然本身沒有長度限制)。
Session原理:因為http是無狀態的連接,Session也不能根據連接來識別是否是同一次會話,因此客戶端第一次請求JSP/Servlet之后,服務端會自動生成一個名叫JSESSIONID的Cookie,該Cookie的值就是sessionID,發送到客戶端,客戶端再次連接的時候,會自動帶上這個JSESSIONID,找到相應的session。如果客戶端端禁用了Cookie,那么這個JSESSIONID會通過URL重寫發送到服務端。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cache-Control: max-age=0 Connection: keep-alive Cookie: JSESSIONID=819B75C412FB029EDEF52B11484A642B Host: localhost:8080 Referer: http://localhost:8080/market/ Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
Session的生命周期:
它的生命周期不累加的,而Cookie的生命周期是累加的,不累加的意思就是Session的計時是從最近一次訪問開始的,而Cookie是從開始到結束,無論你期間是否使用。
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doGet(req, resp); // 真正的創建一個Session HttpSession session = req.getSession(true); // 設置Session的生命周期 session.setMaxInactiveInterval(Integer.MAX_VALUE); }
Session相關的屬性:
6. 講講Request對象的主要方法
序號 | 方法簡述 |
1 | Cookie[] getCookies() 返回一個數組,包含客戶端發送該請求的所有的 Cookie 對象。 |
2 | HttpSession getSession(boolean create) 返回與該請求關聯的當前 HttpSession,或者如果沒有當前會話,且創建是真的,則返回一個新的 session 會話。 |
3 | Enumeration getParameterNames() 返回一個 String 對象的枚舉,包含在該請求中包含的參數的名稱。 |
4 | Object getAttribute(String name) 以對象形式返回已命名屬性的值,如果沒有給定名稱的屬性存在,則返回 null。 |
5 | String getCharacterEncoding() 返回請求主體中使用的字符編碼的名稱。 |
6 | String getMethod() 返回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。 |
7 | String getParameter(String name) 以字符串形式返回請求參數的值,或者如果參數不存在則返回 null。 |
8 | String getRemoteHost() 返回發送請求的客戶端的完全限定名稱 |
9 | String getRemoteAddr() 返回發送請求的客戶端的互聯網協議(IP)地址 |
10 | String getRemoteHost() 返回發送請求的客戶端的完全限定名稱。 |
7.過濾器有哪些作用和用法?
過濾器的常見用途:
a).對用戶的請求進行統一的認證、對訪問的請求進行記錄和審核
b).對用戶傳輸的數據過濾和替換,轉換圖像格式,對響應內容進行壓縮,減少網絡傳輸
c).對用戶的請求和響應進行加密處理
d).觸發資源訪問事件
Filter工作流程:
和 Filter相關的接口定義:
// 編寫一個Filter需要 實現這個接口 public interface Filter { // 初始化Filter public default void init(FilterConfig filterConfig) throws ServletException {} // Filter的邏輯實現,如果有多個Filter,必須在末尾執行 chain.doFilter(req, resp); public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; // 過濾器的銷毀過程,可用於關閉該過濾器中打開的資源 public default void destroy() {} } // 當有多個過濾器連成一串的時候,知道真正的請求資源之前的一系列過濾 public interface FilterChain { public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException; } // 過濾器的配置相關 // 做Filter初始化的時候,作為參數傳入,初始化關於過濾器的配置 public interface FilterConfig { public String getFilterName(); public ServletContext getServletContext(); public String getInitParameter(String name); public Enumeration<String> getInitParameterNames(); }
注意事項: Filter 的執行順序是在 web.xml 中定義的順序,在多個Filter中的chain 中,一定在處理完當前Filter的邏輯之后,調用chain.doFilter(request, response) 轉到下一個Filter
簡單例子:
/** * 實現字符編碼過濾的過濾器 * @author ytuan * */ public class FilterTest implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); chain.doFilter(req, resp); } }
8.請談談你對Javaweb開發中的監聽器的理解?
監聽器示意圖:
JavaWeb中的監聽器按照事件源分為三大類:作用范圍由大而小
a).ServletContext (針對整個應用程序上下文)
b).HttpSession (針對單個用戶會話)
c).ServletRequest (針對某一次ServletRequest )
針對這以上這三種不同作用域的對象,又把對象本身的事件類型分為三種:
a).域對象自身的創建和銷毀事件監聽
b).域對象中屬性的增刪事件監聽
c).監聽綁定到HttpSession域中某個對象的狀態事件監聽
這里的對象創建和銷毀包括三個,域對象中屬性的增刪包括ServletContext 和 ServletRequest 兩個對象。需要重點注意一下HttpSession綁定的對象,它不同於前兩者。
保存在Session域中的對象可以有多種狀態:綁定(session.setAttribute("bean",Object))到Session中;從 Session域中解除綁定(session.removeAttribute("bean"));隨Session對象持久化到一個存儲設備中;隨Session對象從一個存儲設備中恢復
Servlet 規范中定義了兩個特殊的監聽器接口"HttpSessionBindingListener和HttpSessionActivationListener"來幫助JavaBean 對象了解自己在Session域中的這些狀態: ,實現這兩個接口的類不需要 web.xml 文件中進行注冊。
a). HttpSessionBindingListener接口
實現了HttpSessionBindingListener接口的JavaBean對象可以感知自己被綁定到Session中和 Session中刪除的事件
當對象被綁定到HttpSession對象中時,web服務器調用該對象的void valueBound(HttpSessionBindingEvent event)方法
當對象從HttpSession對象中解除綁定時,web服務器調用該對象的void valueUnbound(HttpSessionBindingEvent event)方法
b).HttpSessionActivationListener接口
實現了HttpSessionActivationListener接口的JavaBean對象可以感知自己被活化(反序列化)和鈍化(序列化)的事件
當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被鈍化(序列化)之前,web服務器調用該javabean對象的void sessionWillPassivate(HttpSessionEvent event) 方法。這樣javabean對象就可以知道自己將要和HttpSession對象一起被序列化(鈍化)到硬盤中.
當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被活化(反序列化)之后,web服務器調用該javabean對象的void sessionDidActive(HttpSessionEvent event)方法。這樣javabean對象就可以知道自己將要和 HttpSession對象一起被反序列化(活化)回到內存中 (此處參考:https://www.cnblogs.com/xdp-gacl/p/3969249.html)
9.說說web.xml文件中可以配置哪些內容?
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 配置web引用程序中Servlet上下文的初始化參數 --> <context-param> <param-name>name</param-name> <param-value>ytuan996</param-value> </context-param> <!-- 當程序中發生錯誤時,跳轉到哪一個頁面。這里的錯誤可以是異常,也可以是錯誤碼,但是只能是其中之一 --> <error-page> <exception-type></exception-type> <error-code>500</error-code> <location>error.jsp</location> </error-page> <!-- 配置自己定義的過濾器 --> <filter> <!-- 還可以在這里定義過濾器的自定義參數 --> <init-param> <param-name></param-name> <param-value></param-value> </init-param> <filter-name></filter-name> <filter-class></filter-class> </filter> <!-- 過濾器的規則 --> <filter-mapping> <filter-name></filter-name> <url-pattern></url-pattern> </filter-mapping> <!-- 監聽器 --> <listener> <listener-class></listener-class> </listener> <!-- 配置Servlet --> <servlet> <servlet-name></servlet-name> <servlet-class></servlet-class> </servlet> <!-- 配置Servlet的請求路徑 --> <servlet-mapping> <servlet-name></servlet-name> <url-pattern></url-pattern> </servlet-mapping> <!-- 配置訪問應用的歡迎頁面,一般是首頁面 --> <welcome-file-list> <welcome-file></welcome-file> </welcome-file-list> </web-app>
10.請談談JSP有哪些內置對象?作用分別是什么?
11.說一下表達式語言(EL)的隱式對象及其作用
12.JSP中的靜態包含和動態包含有什么區別?